/**
 * 装饰器部分：
 * 事件处理函数
 * 具体处理数据操作部分
 */

import { ITodo } from "./typings"

//数据容器
let todoData: ITodo[] = []

/**
 * 添加函数的装饰器：
 * @param target 当前装饰函数的容器 xxx.prototype
 * @param methodName 被装饰的函数名称
 * @param descriptor 描述的信息，.value是被装饰执行的函数
 * 注意函数的定义，不要使用箭头函数，会改变传值
 */
export function addTodo (
  target: any,
  methodName: string,
  descriptor: PropertyDescriptor
 ) {
  const _origin = descriptor.value
  descriptor.value = function (todo: ITodo) {
    const _todo: ITodo | null = todoData.find((td: ITodo) => td.content === todo.content)
    if(_todo) {
      alert('该项以添加...')
      return
    }
    todoData.push(todo)
    _origin.call(this, todo)
    console.log("todoData:", todoData)
  }
}

/**
 * 删除数据装饰器：
 * @param target 
 * @param methodName 
 * @param descriptor 
 */
export function removeTodo(
  target: any,
  methodName: string,
  descriptor: PropertyDescriptor
) {
  const _origin = descriptor.value
  descriptor.value = function(id: number) {
    todoData = todoData.filter((todo: ITodo) => todo.id !== id)
    _origin.call(this, id)
    console.log("todoData:", todoData)
  }
}

/**
 * 改变选中状态
 * @param target 
 * @param methodName 
 * @param descriptor 
 */
export function changeCompleted(
  target: any,
  methodName: string,
  descriptor: PropertyDescriptor
) {
  const _origin = descriptor.value
  descriptor.value = function (id: number) {
    todoData.map((todo: ITodo) => {
      if(todo.id === id) {
        todo.completed = !todo.completed
        _origin.call(this, id, todo.completed)
      }
      return todo
    })
    console.log("changeCompleted:", todoData)
  }
}


